#include "plateaurisqgraphics.h"

#include "client.h"

#include "etatgraphics.h"
#include "piongraphics.h"
#include "frontieregraphicsfleche.h"

#include "joueur.h"
#include "etat.h"
#include "pion.h"

#include "log.h"

#include <QDebug>


PlateauRisQGraphics::PlateauRisQGraphics(QWidget *parent) :
    GraphWidget(parent)
{
    plateau = new PlateauRisQ();
    client = new Client();

    hideFlecheFlag = true;
    moveEtatFlag  = false;
    etatAssignerFlag = false;

    lastAddNet = NULL;
    lastRmNet = NULL;



    /* Connexion des signaux graphiques */
    connect(plateau, SIGNAL(nouveauEtat(Etat*)), this, SLOT(nouveauEtat(Etat*)));
    connect(plateau, SIGNAL(nouvelleFrontiere(Frontiere*)), this, SLOT(nouvelleFrontiere(Frontiere*)));
    connect(plateau, SIGNAL(nouveauPion(Pion*)), this, SLOT(nouveauPion(Pion*)));
    connect(plateau, SIGNAL(supprimerPion(Pion*)), this, SLOT(supprimerPion(Pion*)));
    connect(plateau, SIGNAL(nouveauJoueur(Joueur*)), this, SIGNAL(nouveauJoueur(Joueur*)));
    connect(plateau, SIGNAL(supprimerJoueur(Joueur*)), this, SIGNAL(supprimerJoueur(Joueur*)));
    connect(plateau, SIGNAL(ChangeStatut()), this, SLOT(ChangeStatut()));
    connect(plateau, SIGNAL(ChangeJoueur(QString)), this, SLOT(ChangeJoueur(QString)));


    /* Connexion des signaux réseau */
    connect(client, SIGNAL(connecte()), this, SLOT(connecte()));
    connect(client, SIGNAL(deconnecte()), this, SLOT(deconnecte()));
    connect(client, SIGNAL(recvJoueurConnexion(Joueur*)), this, SLOT(recvJoueurConnexion(Joueur*)));
    connect(client, SIGNAL(recvJoueurDeconnexion(int)), this, SLOT(recvJoueurDeconnexion(int)));
    connect(client, SIGNAL(recvJoueursList(QList<Joueur*>)), this, SLOT(recvJoueursList(QList<Joueur*>)));
    connect(client, SIGNAL(recvJoueurId(int)), this, SLOT(recvJoueurId(int)));
    connect(client, SIGNAL(recvMessage(QString,QString,QString)), this, SLOT(recvMessage(QString,QString,QString)));
    connect(client, SIGNAL(recvPaysList(QHash<int,int>)), this, SLOT(recvPaysList(QHash<int,int>)));
    connect(client, SIGNAL(recvPionAdd(int)), this, SLOT(recvPionAdd(int)));
    connect(client, SIGNAL(recvPionRm(int)), this, SLOT(recvPionRm(int)));
    connect(client, SIGNAL(recvChangeStatut(int)), this, SLOT(recvChangeStatut(int)));
    connect(client, SIGNAL(recvInitialise(QString)), this, SLOT(recvInitialise(QString)));
    connect(client, SIGNAL(recvSetJoueur(QString)), this, SLOT(recvSetJoueur(QString)));
}

void PlateauRisQGraphics::connexion(QString host, int port)
{
    client->connexion(host, port);
}

void PlateauRisQGraphics::setJoueurNom(QString nom)
{
    if (plateau->getMoi() != NULL){
        Joueur *j = plateau->getMoi();
        delete j;
    }
    plateau->setMoi(new Joueur(nom));
}

bool PlateauRisQGraphics::loadBoard(QString boardname){
    int r;
    if ( loadBoardPic(plateau->getRessourcesPath() + boardname + ".jpg") < 0 ){
        LOG(OERREUR, "problème lors de l'ouverture de l'image du plateau");
        qDebug() << plateau->getRessourcesPath() + boardname + ".jpg" ;
        return false;
    }
    if ( (r = plateau->chargerXml(plateau->getRessourcesPath() + boardname + ".xml")) < 0 ){
        LOG(OERREUR, "problème lors de l'ouverture du xml du plateau");
        return false;
    }
    plateau->setPlateauNom(boardname);
    return false;
}

void PlateauRisQGraphics::connecte()
{
    LOG(ONOTICE, "Connexion réussie!");

    client->envoyerDonnees(ACT_CONNECT, plateau->getMoi()->getNom());
}

void PlateauRisQGraphics::deconnecte()
{
    LOG(ONOTICE, "Déconnecté du serveur!");

    plateau->reset();
}

void PlateauRisQGraphics::sendAssignerEtats()
{
    if ( etatAssignerFlag == false){
        LOG(ODEBUG, "Envoie le go d'assignation des états au serveur");
        client->envoyerDonnees(ACT_PAYS, "");
        etatAssignerFlag = true;
    }
}

void PlateauRisQGraphics::recvJoueurConnexion(Joueur *joueur)
{
    LOG2(ONOTICE, "Connexion d'un nouveau joueur n°%1 %2!",
         joueur->getId(), joueur->getNom());

    plateau->addJoueur(joueur);
}

void PlateauRisQGraphics::recvJoueurDeconnexion(int id)
{
    Joueur *joueur = plateau->joueurs().at(id);

    LOG2(ONOTICE, "Déconnexion du joueur n°%1 %2!",
         joueur->getId(), joueur->getNom());

    plateau->removeJoueur(joueur);

    client->close();
}

void PlateauRisQGraphics::recvJoueursList(QList<Joueur*> joueurs)
{
    foreach(Joueur *joueur, joueurs){

        if ( joueur->getId() == plateau->getMoi()->getId()){
            // Plus besoin de lui on travaille sur moi
            delete joueur;
            joueur = plateau->getMoi();
        }

        recvJoueurConnexion(joueur);
    }
}

void PlateauRisQGraphics::recvJoueurId(int id)
{
    LOG1(ONOTICE, "Vous êtes le joueur n° %1", id);

    plateau->getMoi()->setId(id);
    //client->envoyerDonnees(ACT_JOUEURS_LIST, plateau->getMoi()->getNom());
}

void PlateauRisQGraphics::recvMessage(QString src, QString msg, QString dest)
{
    QString pseudo_joueur_actuel = getPlateau()->getMoi()->getNom();
    /*if (dest == "Tous"){
        emit nouveauMessage(src, msg, dest, pseudo_joueur_actuel);
    }
    if (dest == pseudo_joueur_actuel){
        emit nouveauMessage(src, msg, dest, pseudo_joueur_actuel);
    }
    else if (dest == plateau->getMoi()->getNom())
        emit nouveauMessage(src, msg, dest, pseudo_joueur_actuel);*/
    LOG(ODEBUG, "Avant appel nouveauMessage depusi recvMessage");
    emit nouveauMessage(src, msg, dest, pseudo_joueur_actuel);
}

void PlateauRisQGraphics::recvPaysList(QHash<int,int> etatsjoueurs)
{



    QHash<int, int>::iterator i = etatsjoueurs.begin();
    while (i != etatsjoueurs.end()) {
        //LOG2(ODEBUG, "assigne %1 -> %2", i.key(), i.value());

        plateau->etats()[i.key()]->setJoueur(plateau->joueurs().at(i.value()));

        LOG2(ODEBUG, "assigne %1 -> %2 ",
             plateau->etats()[i.key()]->getNom(),
             plateau->joueurs().at(i.value())->getNom());

        i++;
    }

    LOG(ONOTICE, "Les états viennent d'être assignés");

    // On passe le flag a true pour éviter qu'un joueur réassigne les états
    etatAssignerFlag = true;






    // Modification du nombre de pions initiaux ici.
    ////////////////
    LOG(ODEBUG, "Juste avant le calcul de pions à donner aux joueurs");
    int nbJoueur = plateau->getnbMaxJoueurs();
    LOG1(ODEBUG, "nombre de joueurs par get %1",nbJoueur);
    int nbPionsChacun;
    switch(nbJoueur)
    {
        case 2:
        nbPionsChacun = 40; /*40*/
        break;

        case 3:
        nbPionsChacun = 35;
        break;

        case 4:
        nbPionsChacun = 30;
        break;

        case 5:
        nbPionsChacun = 25;
        break;

        case 6:
        nbPionsChacun = 20;
        break;

        default:
        nbPionsChacun = -1;
        break;
    }

    for (int j = 0; j < nbJoueur; j++)
    {
        plateau->joueurs()[j]->setNbPionRestant(nbPionsChacun - plateau->joueurs()[j]->getNbEtat());
        LOG2(ODEBUG, "Fonction recvPaysList qui donne aussi les pions à placer initialement; Nombre d'états pour le joueurs %1 : %2",j,plateau->joueurs()[j]->getNbEtat());
        LOG2(ODEBUG, "Joueur %1 a %2 pions à placer", j, nbPionsChacun);
        LOG1(ODEBUG,"nbpions restant par get : %1", plateau->joueurs()[j]->getNbPionRestant());
    }



    ////////////////




}

void PlateauRisQGraphics::recvPionAdd(int etatid)
{
    Pion *p = new Pion();
    lastAddNet = p;
    plateau->etats()[etatid]->addPion(p);

    LOG2(ONOTICE, "%1 ajoute un pion à %2",
        plateau->etats()[etatid]->getJoueur()->getNom(),
        plateau->etats()[etatid]->getNom());
}

void PlateauRisQGraphics::recvPionRm(int etatid)
{
    if (plateau->etats()[etatid]->pions().count() == 0 ) return ;

    Pion *p = plateau->etats()[etatid]->pions().last();

    // Memorise le dernier pion arrivant du réseau
    lastRmNet = p;

    plateau->etats()[etatid]->removeLastPion();
    delete p;

    LOG2(ONOTICE, "%1 enlève un pion à %2",
        plateau->etats()[etatid]->getJoueur()->getNom(),
        plateau->etats()[etatid]->getNom());
}

void PlateauRisQGraphics::nouveauPion(Pion *p)
{
    // ici on ne gère que l'affichage, le pion est déjà ajouté dans etat.cpp addPion
    // mais recvPionAdd de ce fichier appelle aussi addpion
    
    this->scene()->addItem(new PionGraphics(p));

    /* Si le nouveau pion ne provient pas du
       réseau on envoie le mouvement au serveur */
    if ( lastAddNet != p ){
        client->envoyerDonnees(ACT_PION_ADD,
                               QString::number(p->getEtat()->getId()));
    }

}

void PlateauRisQGraphics::supprimerPion(Pion *p)
{
    /* Parcours tous les items graphiques du plateau et essaie
       de les caster en PionGraphics, si le cast réussi et si la valeur
       du pion == p alors on le supprime de l'interface */
    foreach(QGraphicsItem *item, this->scene()->items()){
        PionGraphics *pg;
        if ( (pg = qgraphicsitem_cast<PionGraphics*>(item)) ) {
            if(pg->getPion() == p ){
                this->scene()->removeItem(item);

                /* Si le pion enlevé ne provient pas du
                   réseau on envoie le mouvement au serveur */
                if ( lastRmNet != p ){
                    client->envoyerDonnees(ACT_PION_RM,
                                           QString::number(p->getEtat()->getId()));
                }

                break;
            }
        }
    }
}

void PlateauRisQGraphics::nouveauEtat(Etat *e)
{
    EtatGraphics *getat = new EtatGraphics(e);
    //connect(e, SIGNAL(ChangeStatut()), this, SLOT(ChangeStatut()));
    this->scene()->addItem(getat);
}

void PlateauRisQGraphics::nouvelleFrontiere(Frontiere *e)
{
    FrontiereGraphics *fg = new FrontiereGraphicsFleche(e);
    this->scene()->addItem(fg);

    if ( hideFlecheFlag )
        fg->hide();
    else
        fg->show();
}

void PlateauRisQGraphics::sendMessage(QString dst, QString msg)
{
    if (plateau->getMoi() != NULL )
    {
        //Q_UNUSED(dst);

        /* Construit le message à envoyer, badboy way! ( format dst:msg ) */
        QString m = dst+":";
        m.append(trUtf8("%1:%2").arg(plateau->getMoi()->getNom()).arg(msg));

        qDebug() << "MESSAGE SENDMESSAGE : " << m ;

        LOG1(ODEBUG, "Envoie message %1", msg);
        client->envoyerDonnees(ACT_MESSAGE, m);
    }
}

void PlateauRisQGraphics::hideFleche(bool b)
{
    hideFlecheFlag = b;

    /* Parcours tous les items graphiques du plateau et essaie
       de les caster en FrontiereGraphics, si le cast réussi on cache on affiche
       la frontiere ( la fleche ) */
    foreach(QGraphicsItem *item, this->scene()->items()){
        FrontiereGraphics *fg;
        if ( (fg = qgraphicsitem_cast<FrontiereGraphics*>(item)) ) {
            if ( hideFlecheFlag )
                fg->hide();
            else
                fg->show();
        }
    }
}

void PlateauRisQGraphics::moveEtat(bool b)
{
    moveEtatFlag = b;
    /* Parcours tous les items graphiques du plateau et essaie
       de les caster en EtatGraphics, si le cast réussi on appel setMove
       qui se charge de rentre l'état déplaÃ§able */
    foreach(QGraphicsItem *item, this->scene()->items()){
        EtatGraphics *eg;
        if ( (eg = qgraphicsitem_cast<EtatGraphics*>(item)) ) {
            eg->setMove(moveEtatFlag);
        }
    }
}

// le recv agit pour changer l'état du jeu (reçu par tout les clients)
// et changestatut (autre fonction de plateaurisqgraphics) envoie à tout le monde
// un signal disant qu'il faut changer le statut et donc changestatut est appelée
// en cliquant sur un bouton (genre fin du tour,étape suivante)
void PlateauRisQGraphics::recvChangeStatut(int etape)
{
    /*
      Tout les joueurs doivent arriver à cette fonction
        et passer par le switch car le int de etape reçu
        correspond à celui envoyé à tout le monde avec l'action
        ACT_CHANGE_STATUT donc si je ne me trompe pas le joueur qui envoie cet
        ACT_CHANGE_STATUT va changer le tour du joueur quand il finit
        pour passer au suivant puis on relance ACT_CHANGE_STATUT avec étape 1
        qui sera effectuée par le joueur en cours.

*/
        LOG1(ODEBUG, "valeur etape %1", etape);

        QString nomEtape;
        QString sujet;
        if (plateau->getJoueur_en_cours() == plateau->getMoi()->getId())
            sujet = "Vous passez ";
        else
            sujet = trUtf8("Le joueur n°") + QString::number(plateau->getJoueur_en_cours()) + trUtf8(" passe ");
        switch(etape){
            case 0: // changement de joueur
            {
                //on doit passer à l'étape 0, changement de joueur
                //si avec +1 on dépasse le max on retourne au joueur n°0
                //mais il faut aussi vérifier les joueurs éliminés

                int jmax = plateau->joueurs().count();
                int jsuivant = (plateau->getJoueur_en_cours() + 1) % jmax ;
                LOG1(ODEBUG, "valeur vaincupar du joueur suivant vaut %1",plateau->joueurs()[jsuivant]->getVaincupar());
                while (plateau->joueurs()[jsuivant]->getVaincupar() != -1) //alors le joueur suivant est vaincu, on tourne.
                {
                    jsuivant = (jsuivant + 1) % jmax ;
                }


                plateau->setJoueur_en_cours(jsuivant) ;
                
                // renforts à true même si on passe pas au renfort mais qu'on fait 
                // encore l'initial puisque l'initial passe avant renfort c'est ok
                plateau->setdeplacement_troupes(false) ;
                plateau->setjoueur_changed(true) ;

                if (!(plateau->getplacement_Initial())) // si je ne suis pas au placement initial
                {
                    ChangeStatut(); // alors passage direct au renfort
                }

                
                LOG1(ONOTICE, "C'est au tour du joueur n°%1", jsuivant);
                break;
            }

            case 1: // renfort
            {
                // le joueur en cours reçoit des renforts et les place
                plateau->setjoueur_changed(false) ;
                plateau->setplacement_renforts(true) ;


                if (plateau->getJoueur_en_cours() == plateau->getMoi()->getId())
                {
                    if (plateau->getMoi()->getObjectif()->est_accomplie(plateau,plateau->getMoi())) // vérif de la mission
                    {
                        //QColor coul_joueur = plateau->getMoi()->getCouleur();
                        //qDebug() << coul_joueur.toRgb() ;
                        sendMessage("all",":ONOTICE"); // pour un retour à la ligne
                        sendMessage("all",":ONOTICE");
                        QString chaine = trUtf8("<font color=\"Red\"><strong>Le joueur ");
                        chaine.append(plateau->getMoi()->getNom());
                        chaine.append(trUtf8(" a gagné la partie !</strong></font>:ONOTICE"));
                        sendMessage("all",chaine);
                        sendMessage("all",":ONOTICE");
                        sendMessage("all",":ONOTICE");
                        // dire à tout le monde que la partie est FINIE.
                    }
                    // ce serait plus propre de retoucher la classe mission pour lui lier un joueur et plateau.
                }

//                if (plateau->getJoueur_en_cours() == plateau->getMoi()->getId())
//                {
                /* on pourrait un peu améliorer cette fonction en évitant de la faire exécuter à tout les joueurs
                  et en ne la laissant que pour le joueur en cours ou même le serveur, puis le serveur redistribue
                  l'info à tout le monde, ça évite de voir tout le monde faire le calcul. */
                    plateau->appelleRenforts();
//                }

                nomEtape = "Renforts.";
                LOG2(ONOTICE, "%1à l'étape %2", sujet, nomEtape);
                break;
            }
            case 2: // attaque
            {
                // le joueur en cours ne peut rien déplacer mais il peut attaquer
                // autant de fois qu'il veut
                plateau->setplacement_renforts(false) ;
                plateau->setattaques(true) ;

                if (plateau->getJoueur_en_cours() == plateau->getMoi()->getId())
                {
                    // appel ici de la fonction laissant le joueur concerné attaquer qui il veut.
                     LOG(ONOTICE,"Sélectionnez successivement le pays d'où part l'attaque puis votre cible.");
                     plateau->setEtat_attaquant(-1);
                     plateau->setEtat_cible(-1);
                }

                nomEtape = "Attaque.";
                LOG2(ONOTICE, "%1à l'étape %2", sujet, nomEtape);
                break;
            }
            case 3: // déplace 1 fois
            {
                // le joueur en cours a le droit de déplacer une fois une ou des unités d'un
                // seul pays à lui vers un pays connecté directement ou indirectement à ce dernier
                plateau->setattaques(false) ;
                plateau->setdeplacement_troupes(true) ;
                nomEtape = trUtf8("Stratégique.");
                LOG2(ONOTICE, "%1à l'étape %2", sujet, nomEtape);
                break;
            }
            case 4: // ajoutait 1 fois, si on a 4 c'est fini on fait cycle 01230123
            {
                plateau->setplacement_Initial(false) ;
                plateau->setjoueur_changed(true) ;
                plateau->setJoueur_en_cours(0);
                ChangeStatut(); // d'habitude appelé en cliquant sur étape/tour suivant(e)
                nomEtape = "Initiale";
                LOG1(ONOTICE, "L'étape %1 est terminée.", nomEtape);
                break;
            }
            default:
                LOG(ODEBUG, "c'est quoi ce numéro d'étape ?");
                break;

        }


}


void PlateauRisQGraphics::ChangeStatut()
{
    //// au début c'est 0 0 0 0 0 0 0 0 0 0  jusqu'à plus de pions à placer 0 0 0 ""4""
    // 0 change de joueur
    // 1 renforts
    // 2 attaque
    // 3 déplace 1 fois
    // 4 place 1 fois (ajoute) est terminé on enclenche sur 1 2 3 0 1 2 3 0 1 2 3...
    // 5 peut-être pour dire que le jeu est fini.
   // LOG(ONOTICE, "Dehors");

    //LOG(ODEBUG, "Appel de change statut");


    if (plateau->getJoueur_en_cours() == plateau->getMoi()->getId() )
    {
        //LOG(ONOTICE, "Dedans");
        // pour la première il faut que chaque joueur ait eu nbpionrestant = 0 et placemenInitial true
        if (plateau->getplacement_Initial() && (plateau->getJoueurs_ayant_restant_nul() != plateau->joueurs().count()) )
        {
            client->envoyerDonnees(ACT_CHANGE_STATUT,QString::number(0));
        }
        else if (plateau->getplacement_Initial() )//&& (plateau->getMoi()->getNbPionRestant() == 0)) // && !reste_pions_à_placer.
            client->envoyerDonnees(ACT_CHANGE_STATUT,QString::number(4));
        else if (plateau->getjoueur_changed()) // joueur changé, là le nouveau joueur arrive ici
            client->envoyerDonnees(ACT_CHANGE_STATUT,QString::number(1)); // je m'envoie le signal renforts
        else if (plateau->getplacement_renforts()) //on fini renforts, on attaque
            client->envoyerDonnees(ACT_CHANGE_STATUT,QString::number(2));// attaque
        else if (plateau->getattaques()) // on finit attaques
            client->envoyerDonnees(ACT_CHANGE_STATUT,QString::number(3));// on déplace
        else if (plateau->getdeplacement_troupes()) //dernière étape terminée
            client->envoyerDonnees(ACT_CHANGE_STATUT,QString::number(0));// change joueur
        else
            LOG(ODEBUG, "Il semblerait qu'aucun booléen ne soit à VRAI...");
    }
}

void PlateauRisQGraphics::recvInitialise(QString valeurs)
{
    LOG1(ODEBUG,"donnée reçue par recvInitialise : %1",valeurs);
    QList<QString> recues = valeurs.split(";");
    // qDebug() << "liste décomposée de recvInitialise" ;
    // qDebug() << recues ;
    plateau->setnbMaxJoueurs(recues.at(0).toInt());
    plateau->creerObjectifs();
    int mon_objectif = recues.at(plateau->getMoi()->getId()+1).toInt(); // étant donné que le premier élément de recues n'est pas un objectif, mais le nombre de joueurs et que le reste étant les objectifs des joueurs (de 0 à 5 max pour 6 joueurs)
    plateau->getMoi()->setObjectif(plateau->getObjectif(mon_objectif));
    // le reste des valeurs reçues corresond à l'attribution des missions
    LOG2(ODEBUG,"Le joueur %1 a la mission %2",plateau->getMoi()->getId(), mon_objectif );
}

void PlateauRisQGraphics::ChangeJoueur(QString data)
{
    client->envoyerDonnees(ACT_SET_JOUEUR,data);
}

void PlateauRisQGraphics::recvSetJoueur(QString data)
{
    LOG1(ODEBUG,"donnée reçue par recvSetJoueur : %1",data);
    QList<QString> recues = data.split(";");
    int idE = recues.at(0).toInt();
    int idJ = recues.at(1).toInt();
    // pour l'instant l'état idE n'est pas encore assigné à (capturé par) idJ
    // je regarde s'il a un seul état, si oui c'est celui çi et il va se le faire prenre par idJ donc vaincupar idJ
    Joueur* pointeur_joueur_perdant = plateau->etats()[idE]->getJoueur() ;
    LOG1(ODEBUG,"Nombre d'états pour joueur perdant son état est %1", plateau->nbr_etats_acquis(pointeur_joueur_perdant) );
    if (plateau->nbr_etats_acquis(pointeur_joueur_perdant) <= 1 )//alors il va le perdre
    {

        pointeur_joueur_perdant->setVaincupar(idJ); // et dans cette fonction tout le monde le sait.
    }

    plateau->etats()[idE]->setJoueur(plateau->joueurs()[idJ]);
}



void PlateauRisQGraphics::AfficheMission()
{
    Missions* obj = plateau->getMoi()->getObjectif();
    QString debut = trUtf8("Votre Mission consiste à");

    LOG(ODEBUG, "Affichage de mission");

    if (obj->getid_joueur_cible() != -1)// c'est que la mission consiste à détruire quelqu'un
    {
        // test de l'existence d'un joueur
        if (plateau->joueurs()[obj->getid_joueur_cible()]->getVaincupar() == -1 )
        {
            LOG2(ONOTICE, "%1 éliminer le joueur %2",debut, plateau->joueurs()[obj->getid_joueur_cible()]->getNom() );
        }
        else
        {
            LOG2(ONOTICE, "%1 conquérir 24 pays car le joueur %2 n'a pas été éliminé par vous.",debut, plateau->joueurs()[obj->getid_joueur_cible()]->getNom() );
        }
    }
    else if (obj->getmin_continents() != 0) // mission continents à obtenir
    {
        QString tmp;
        LOG(ODEBUG,"mission continents p1");

        if (obj->getcontinents_a_obtenir().count() == 0) exit(2);

        switch (obj->getcontinents_a_obtenir()[0])
        {
        case 1:
            tmp = trUtf8("Amérique du Nord");
            break;
        case 2:
            tmp = trUtf8("Amérique du Sud");
            break;
        case 3:
            tmp = trUtf8("Afrique");
            break;
        case 4:
            tmp = trUtf8("Europe");
            break;
        case 5:
            tmp = trUtf8("Asie");
            break;
        case 6:
            tmp = trUtf8("Océanie");
            break;
        default:
            tmp ="";
            break;
        }

    LOG(ODEBUG,"mission continents p2");
        QString reste = tmp;
        for (int i = 1 ; i < obj->getcontinents_a_obtenir().count() ; i++)
        {
            if ( i != obj->getcontinents_a_obtenir().count() - 1 )
                reste.append(", ");
            else
                reste.append(" et ");

            switch (obj->getcontinents_a_obtenir()[i])
            {
            case 1:
                tmp = trUtf8("Amérique du Nord");
                break;
            case 2:
                tmp = trUtf8("Amérique du Sud");
                break;
            case 3:
                tmp = trUtf8("Afrique");
                break;
            case 4:
                tmp = trUtf8("Europe");
                break;
            case 5:
                tmp = trUtf8("Asie");
                break;
            case 6:
                tmp = trUtf8("Océanie");
                break;
            default:
                tmp ="";
                break;
            }

            LOG(ODEBUG,"mission continents p3");

            reste.append(tmp);
        }


        if ( obj->getmin_continents() != obj->getcontinents_a_obtenir().count() )
        {
            LOG2(ONOTICE, "%1 conquérir les continents %2 et un troisième continent de votre choix.",debut, reste );
        }
        else
        {
            LOG2(ONOTICE, "%1 conquérir les continents %2",debut, reste );
        }



    }
    else // if (min_pays != 0) quantité de pays à obtenir
    {
        if (obj->getmin_pays()== 18)
        {
            LOG1(ONOTICE, "%1 conquérir 18 pays avec 2 armées minimum par pays.",debut);
        }
        else if (obj->getmin_pays() == 24)
        {
            LOG1(ONOTICE, "%1 conquérir 24 pays.",debut);
        }
        else
        {
            LOG(ODEBUG, "soit une mission est mal initialisée, soit min_pays à conquérir != 18 et 24");
        }
    }




}
